//
//  ILBleDataUtil.h
//  IMIHome
//
//  Created by 严敏 on 2021/6/22.
//  Copyright © 2021 上海创米科技有限公司. All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

/**
 * 创米蓝牙Client (service uuid)
 **/
#define IL_BLE_SERVICE_UUID  @"4a6e4000-5e16-459a-9e5b-86f23a314181"
/**
 * 创米写通道 ( Characteristic Service  uuids)
 */
#define IL_BLE_WRITE_SERVICE_UUID @"4a6e4008-5e16-459a-9e5b-86f23a314181"
/**
 * 创米读通道 ( Characteristic Service  uuids)
 */
#define IL_BLE_NOTIFY_SERVICE_UUID  @"4a6e4007-5e16-459a-9e5b-86f23a314181"

typedef NS_ENUM(NSInteger , ILBleDeviceError) {
    /// 获取设备四元组错误（云端异常）
    ILDevicePropertyError = -1,
    /// 云服务未找到此设备
    ILDeviceNotFound = -2,
    /// 当前用户没有该设备的lmtk记录
    ILDevicelmtkNotFound = -3,
    /// 提交注册确认消息异常
    ILRegistConfirmMessageError = -4,
    /// 设备已被绑定
    ILDeviceAlreadyBind = -8,
    /// 连接蓝牙设备失败
    ILDeviceConnectBleError = -100,
    /// 断开连接
    ILDeviceDisconnected = -101,
    /// 尚未登录到蓝牙端
    ILNotLoginToBle = -102,
    /// 尚未初始化
    ILNotInit = -103,
    /// 扫描目标设备失败（未找到）
    ILTargetDeviceNotFound = -104,
    /// 请检查蓝牙是否开启
    ILCheckBleState = -105,
    /// pk,dn ，null 信息空
    ILInfoNull = -201,
    /// 登录到设备失败，
    ILLoginToDeviceFaild = -202,
    /// APP生成密钥对失败
    ILCreatPasswordFaild = -203,
    /// 未找到app本地密钥
    ILLocalPasswordNotFound = -204,
    /// 蓝牙未打开
    ILBleNotEnabled = 301,
    /// 没有扫描到目标蓝牙
    ILBleTargetBleNotFound = 304,
    /// 蓝牙数据校验失败
    ILBleDataVerifyFaild = 305,
    /// 操作失败 0x01
    ILBleDeviceErrorFaild = 1,
    /// 超时退出 0x02
    ILBleDeviceErrorTimeOut = 2,
    /// 参数错误 0x03
    ILBleDeviceErrorParamWrong = 3,
    /// 数据长度错误 0x04
    ILBleDeviceErrorDataLengthWrong = 4,
    /// 重复密码 0x05
    ILBleDeviceErrorPasswordRepetition = 5,
    /// 无用户 0x06
    ILBleDeviceErrorUserNull = 6,
    /// 部分操作成功 0x07
    ILBleDeviceErrorSomeOperationsSucceeded = 7,
    /// 中间过程返回 0x08
    ILBleDeviceErrorIntermediateProcessReturn = 8,
    /// 删除失败 0x09
    ILBleDeviceErrorDeleteFaild = 9,
    /// CRC校验失败 0x0a
    ILBleDeviceErrorCRCCheckFaild = 10,
    /// 指纹添加过程中，指纹区域重复 0x0b
    ILBleDeviceErrorFingerprintRepeat = 11,
    /// 用户修改密码值和原密码不匹配 0x0c
    ILBleDeviceErrorPasswordsDoNotMatch = 12,
    /// APP发起绑定，蓝牙返回已绑定 0x0d
    ILBleDeviceErrorBleHasBind = 13,
    /// 蓝牙没有获取到四元组/如果是带猫眼的设备则猫眼异常，反之则是蓝牙异常，一般不会出现，为设备bug 0x0e
    ILBleDeviceErrorPropertyNull = 14,
    /// 带wifi 设备连接wfi失败 0x0f
    ILBleDeviceErrorWifiConnectFaild = 15,
    /// wifi信息错误 0x10
    ILBleDeviceErrorWifiInfoWrong = 16,
    /// wifi信息错误 0x11
    ILBleCatEyeNotOpen = 17,
    /// 未知错误 -9999
    ILBleDeviceErrorUnkonw = -9999,
    /// 操作超时
    ILOperationTimeOut = -9998,
};

typedef struct ILBleDeviceErrorStruct{
    ILBleDeviceError error;
    NSString *errorCode;
    NSString *errorDes;
    ///解决方案
    NSString *solution;
}ILBleDeviceErrorStruct;

@interface ILBleDataUtil : NSObject

/**
 * 带子包的协议体
 * @param pactId    协议号
 * @param msgId     消息号
 * @param funId     功能号
 * @param subFunId  子功能号
 * @param data      子包数据
 * @return 带协议头和结尾crc的bytes
 */
+ (NSData *)getHeadBytes:(Byte *)pactId msgId:(Byte)msgId funId:(Byte)funId subFunId:(Byte)subFunId data:(NSData *)data;

+ (NSData *)getHeadBytes:(Byte *)pactId funId:(Byte)funId subFunId:(Byte)subFunId data:(NSData *)data;

+ (NSData *)getHeadBytes:(Byte *)funIdAndSubFunId data:(NSData *)data;

+ (NSData *)getHeadBytes:(Byte)funId subFunId:(Byte)subFunId data:(NSData *)data;

+ (NSData *)getHeadBytesNoData:(Byte *)funIdAndSubFunId;

+ (NSData *)getHeadBytesNoData:(Byte)funId subFunId:(Byte)subFunId;

+ (Byte)getMsgId;

+ (BOOL)isMatchPact:(NSData *)data;

+ (BOOL)isMatchCRC8:(NSData *)data;

//NSData转换为普通字符串。
+ (NSString *)data2HexString:(NSData *)data;

+ (NSString *)data2String:(NSData *)data;

+ (NSData *)string2data:(NSString *)str;

//NSData转换为普通字符串。
+ (NSData *)hexString2Data:(NSString *)str;

//十六进制字符串转换为普通字符串。
+ (NSString *)hexString2String:(NSString *)hexString;

//普通字符串转换为十六进制字符串
+ (NSString *)string2HexString:(NSString *)string;

//十六进制字符串转换为普通字符串NSData。
+ (NSData *)hexString2StringData:(NSString *)hexString;

//int转data
+ (NSData *)int2Data:(int)i;

//data转int
+ (int)data2Int:(NSData *)data;

//2位byte数组转int
+ (NSInteger)twoBytesInt:(Byte *)bytes;

#pragma mark - 蓝牙绑定协议

//通用判断返回消息是否是成功的
+ (BOOL)isSuccessBleData:(NSData *)data;

//step1 app 发起绑定,获取蓝牙 dn+pda+pdc（0x0c,0x01）
+ (NSData *)imiBleBindDataStep1;

+ (BOOL)isMatchCallbackImiBleBindDataStep1:(NSData *)data;

//step2 创米云绑定 app 端确认消息（0x0c,0x0d）
+ (NSData *)imiBleBindDataStep2;

+ (BOOL)isMatchCallbackImiBleBindDataStep2:(NSData *)data;

//step3 云端返回绑定信息, app 发送给蓝牙（0x0c,0x02）
+ (NSData *)imiBleBindDataStep3:(NSData *)data;

+ (BOOL)isMatchCallbackImiBleBindDataStep3:(NSData *)data;

//step4 创米云绑定 app 端发送绑定完成消息（0x0c,0x0e）
+ (NSData *)imiBleBindDataStep4:(NSData *)data;

+ (BOOL)isMatchCallbackImiBleBindDataStep4:(NSData *)data;

//step1 app 发起登陆（0x0c,0x03）
+ (NSData *)imiBleLoginDataStep1;

+ (BOOL)isMatchCallbackImiBleLoginDataStep1:(NSData *)data;

//step2 app 发送云端签权结果到蓝牙（0x0c,0x04）
+ (NSData *)imiBleLoginDataStep2:(NSData *)data;

+ (BOOL)isMatchCallbackImiBleLoginDataStep2:(NSData *)data;

//step1 app 获取猫眼 wifi 连接和绑定状态（0x0c,0x05）
+ (NSData *)imiBleCatEyeDataStep1;

+ (BOOL)isMatchCallbackImiBleCatEyeDataStep1:(NSData *)data;

//step2 app 发送 wifi 信息到 android(猫眼)（0x0c,0x06）
+ (NSData *)imiBleCatEyeDataStep2:(NSData *)data;

+ (BOOL)isMatchCallbackImiBleCatEyeDataStep2:(NSData *)data;

//step3 配对请求头匹配 android(猫眼)发送 token 给 app 信息（0x0c,0x07）
+ (BOOL)isMatchCallbackImiBleCatEyeDataStep3:(NSData *)data;


@end

NS_ASSUME_NONNULL_END
